package cn.miju.wechatpay.response;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;

import java.io.Serializable;
import java.util.List;

/**
 * <pre>
 * 业务类
 * </pre>
 *
 * @author Huzb
 * @version 1.0.0
 * @since 2023年05月04日 17:15
 */
@Data
@SuperBuilder
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class WechatpayQueryOrderResp extends WechatpayBaseResp {
    private static final long serialVersionUID = 1L;

    /**
     * 应用ID
     */
    private String appid;

    /**
     * 直连商户号
     */
    private String mchid;

    /**
     * 商户订单号
     */
    private String outTradeNo;

    /**
     * 微信支付订单号
     */
    private String transactionId;

    /**
     * 交易类型
     * JSAPI：公众号支付
     * NATIVE：扫码支付
     * APP：APP支付
     * MICROPAY：付款码支付
     * MWEB：H5支付
     * FACEPAY：刷脸支付
     */
    private String tradeType;

    /**
     * 交易状态
     * SUCCESS：支付成功
     * REFUND：转入退款
     * NOTPAY：未支付
     * CLOSED：已关闭
     * REVOKED：已撤销（仅付款码支付会返回）
     * USERPAYING：用户支付中（仅付款码支付会返回）
     * PAYERROR：支付失败（仅付款码支付会返回）
     */
    private String tradeState;

    /**
     * 交易状态描述
     */
    private String tradeStateDesc;

    /**
     * 付款银行
     */
    private String bankType;

    /**
     * 附加数据
     */
    private String attach;

    /**
     * 支付完成时间 格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE
     */
    private String successTime;

    /**
     * 支付者信息
     */
    private Payer payer;

    /**
     * 订单金额信息
     */
    private Amount amount;


    /**
     * 场景信息
     */
    private SceneInfo sceneInfo;

    /**
     * 优惠功能
     */
    private PromotionDetail promotionDetail;


    @Data
    @Accessors(chain = true)
    public static class Amount implements Serializable {
        private static final long serialVersionUID = 1L;

        /**
         * 订单总金额，单位为分。
         */
        private Integer total;

        /**
         * 用户支付金额 单位为分。（指使用优惠券的情况下，这里等于总金额-优惠券金额）
         */
        private Integer payerTotal;

        /**
         * 货币类型 CNY：人民币，境内商户号仅支持人民币。示例值：CNY
         */
        private String currency;

        /**
         * 用户支付币种 用户支付币种示例值：CNY
         */
        private String payerCurrency;
    }

    @Data
    @Accessors(chain = true)
    public static class Payer implements Serializable {
        private static final long serialVersionUID = 1L;

        /**
         * 用户标识 用户在直连商户appid下的唯一标识。
         */
        private String openid;
    }

    @Data
    @Accessors(chain = true)
    public static class SceneInfo implements Serializable {
        private static final long serialVersionUID = 1L;

        /**
         * 商户端设备号 (发起扣款请求的商户服务器设备号）。
         */
        private String deviceId;
    }

    @Data
    @Accessors(chain = true)
    private static class PromotionDetail implements Serializable {
        private static final long serialVersionUID = 1L;


        /**
         * 券ID
         */
        private String couponId;

        /**
         * 优惠名称
         */
        private String name;

        /**
         * 优惠范围 GLOBAL：全场代金券 SINGLE：单品优惠
         */
        private String scope;

        /**
         * 优惠类型 	CASH：充值型代金券 NOCASH：免充值型代金券
         */
        private String type;

        /**
         * 优惠券面额
         */
        private Integer amount;

        /**
         * 活动ID
         */
        private String stockId;

        /**
         * 微信出资 单位为分
         */
        private Integer wechatpayContribute;

        /**
         * 商户出资 单位为分
         */
        private Integer merchantContribute;

        /**
         * 其他出资 单位为分
         */
        private Integer otherContribute;

        /**
         * 优惠币种 	CNY：人民币，境内商户号仅支持人民币。
         */
        private String currency;

        /**
         * 单品列表
         */
        private List<GoodsDetail> goodsDetail;

    }

    @Data
    @Accessors(chain = true)
    public static class GoodsDetail implements Serializable {
        private static final long serialVersionUID = 1L;


        /**
         * 商品编码
         */
        private String goodsId;

        /**
         * 商品数量
         */
        private Integer quantity;

        /**
         * 商品单价 单位为分
         */
        private Integer unitPrice;

        /**
         * 商品优惠金额
         */
        private Integer discountAmount;

        /**
         * 商品备注
         */
        private String goodsRemark;
    }


}
